home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / tomlanvec.lha / Thomas-landspurg-source / 3d_source.s next >
Text File  |  1990-09-26  |  19KB  |  835 lines

  1.     ; ***************************************
  2.     ; * Affichage d'un objet en 3D filiaire *
  3.     ; * par Thomas LANDSPURG                *
  4.     ; * IMPORTANT:                *
  5.     ; * this version is for Devpack         *
  6.     ; * Need the file    datasin        *
  7.     ; ***************************************
  8. task_stop=1        ; if we want to be in singletask mode
  9.  
  10. NB_POINTS_MAX=100    ; number max of point
  11. TAILLEY=256
  12. speed_dep=2
  13. speed_rot=3
  14.  
  15. prof=1            ; nb de bitplanes de l'ecran
  16.     ;EXEC
  17. execbase=4
  18. openlib=-408
  19. closelib=-414
  20. AllocMem=-$c6
  21. FreeMem=-$d2
  22. Forbid=-132
  23. Permit=-138
  24. MEMF_CLEAR=$10000
  25. MEMF_CHIP=2
  26.     ;GRAPHICS
  27. OwnBlitter=-456
  28. DisOwnBlitter=-462
  29.  
  30.     ; Hardware registers
  31.  
  32. COPRBASE=$dff000
  33. DMACONR=2
  34. BLTADAT=$74
  35. BLTBDAT=$72
  36. BLTCDAT=$70
  37. BLTAFWM=$44
  38. BLTALWM=$46
  39. BLTAMOD=$64
  40. BLTBMOD=$62
  41. BLTCMOD=$60
  42. BLTDMOD=$66
  43. BLTCON0=$40
  44. BLTCON1=$42
  45. BLTSIZE=$58
  46. BLTAPTH=$50
  47. BLTBPTH=$4c
  48. BLTCPTH=$48
  49. BLTDPTH=$54
  50. COP1LCH=$80
  51. COPJMP1=$88
  52. DMACON=$96
  53. VHPOSR=6
  54.  
  55. start:
  56.     bsr    in_wb
  57.     bsr    initlib            ; ouvre les librairies
  58.  
  59.     ; ALLOCATION MEMOIRE DE L'ECRAN
  60.  
  61.     move.l    execbase,a6
  62.     move.l    #taillescr*2,d0        ; taille*2 car double buffering
  63.     move.l    #MEMF_CLEAR+MEMF_CHIP,d1
  64.     jsr    AllocMem(a6)
  65.     tst.l    d0            ; d0 pointe sur la zone memoire
  66.     beq    erreur_mem        ; si d0=0,l'allocation n'a pas eu lieu
  67.     move.l    d0,abitplane0        ; pointeur sur le premier ecran
  68.     move.l    d0,bitplane0
  69.     add.l    #taillescr,d0
  70.     move.l    d0,bbitplane0        ; pointeur sur le deuxieme ecran
  71.  
  72.     ; ALLOCATION MEMOIRE DE LA COPPERLIST
  73.  
  74.     move.l    execbase,a6        ;reserve de la memoire pour la coplist
  75.     move.l    #taillecop,d0        ; la taille a ete choisie large
  76.     move.l    #$10002,d1        ; la coplist doit etre en chip
  77.     jsr    AllocMem(a6)
  78.     tst.l    d0            ; l'accation a bien eu lieu?
  79.     beq    erreur_cop        ; non,alors sortie
  80.     move.l    d0,coplist        ; sauvegarde le pointeur sur la coperlist
  81.  
  82.     ; ALLOCATION MEMOIRE DU BUFFER CONTENANT LES POINTS 2d
  83.  
  84.     move.l    execbase,a6        ;reserve de la memoire pour la coplist
  85.     move.l    #NB_POINTS_MAX*2,d0        ; la taille a ete choisie large
  86.     move.l    #$10000,d1
  87.     jsr    AllocMem(a6)
  88.     tst.l    d0            ; l'accation a bien eu lieu?
  89.     beq    erreur_point        ; non,alors sortie
  90.     move.l    d0,tabpos        ; sauvegarde le pointeur sur le buffer
  91.  
  92.     move.w    #$8400,DMACONR+COPRBASE    ; autorise les DMA blitter
  93.     move.w    #32,DMACON+COPRBASE    ; eteint les sprites
  94.     bsr    initcop            ; initialise la copper list
  95.  
  96.     ; ARRET DU MULTITACHE
  97.  
  98.     ifne task_stop
  99.     move.l    graphbase,a6
  100.     jsr    OwnBlitter(a6)        ; prend le controle du blitter
  101.     move.l    execbase,a6
  102.     jsr    Forbid(a6)        ; arrete le multitache
  103.     move.b    #%10000111,$bfd100    ; arrete le drive
  104.     endc
  105.  
  106.     ; APPEL AU PROGRAMME PRINCIPAL
  107.  
  108.     bsr    main_pg            ; pg principal
  109. out:
  110.     ; REMISE EN ROUTE DU MULTITACHE
  111.     
  112.     ifne task_stop
  113.     move.l    execbase,a6
  114.     jsr    Permit(a6)        ; remet en marche le multitache
  115.     move.l    graphbase(pc),a6
  116.     jsr    DisOwnBlitter(a6)    ; libere le blitter
  117.     endc
  118.  
  119.     ; RESTAURE LA COPPER LIST
  120.  
  121.     move.l    graphbase,a0
  122.     move.l    oldcop,$32(a0)        ; remet le pointeur de l'ancinne coperlist
  123. ;    move.l    $26(a0),COPRBASE+COP1LCH
  124.     move.l    execbase,a6
  125.     move.l    tabpos,a1        ; pointeur sur la zone memoire qui a ete allouer
  126.     move.l    #NB_POINTS_MAX,d0    ; taille de cette zone memoire
  127.     jsr    FreeMem(a6)        ; desallocation
  128. erreur_point:
  129.     move.l    execbase,a6
  130.     move.l    coplist,a1        ; pointeur sur la zone memoire qui a ete allouer
  131.     move.l    #taillecop,d0        ; taille de cette zone memoire
  132.     jsr    FreeMem(a6)        ; desallocation
  133. erreur_cop:
  134.     move.l    execbase,a6
  135.     move.l    abitplane0(pc),a1    ; adresse de la zone memoire
  136.     move.l    #taillescr*2,d0        ; taille de la zone memoire
  137.     jsr    FreeMem(a6)        ; desaocation
  138. erreur_mem:
  139.     bsr    freelib            ; libere les librairies
  140.  
  141.     move.w    #$8020,DMACON+COPRBASE    ; autorise les sprites
  142.  
  143.     bsr    out_wb
  144.     clr.l    d0            ; pour signaler au dos qu'il n y pas d'erreur
  145.     rts
  146.  
  147.     ; WORKBENCH STARTUP CODE
  148. FindTask=-294
  149. WaitPort=-384
  150. GetMsg=-372
  151. ;Forbid=-132
  152. ReplyMsg=-378
  153. in_wb:    clr.l    WBenchMsg    ; workbench startup
  154.     move.l    execbase,a6
  155.     sub.l    a1,a1
  156.     jsr    FindTask(a6)
  157.     move.l    d0,a4
  158.     tst.l    $ac(a4)
  159.     bne    du_cli
  160.     lea    $5c(a4),a0
  161.     jsr    WaitPort(a6)
  162.     lea    $5c(a4),a0
  163.     jsr    GetMsg(a6)
  164.     move.l    d0,WBenchMsg
  165. du_cli:    rts
  166. out_wb:    tst.l    WBenchMsg
  167.     beq    pas_work
  168.     move.l    execbase,a6
  169.     jsr    Forbid(a6)
  170.     move.l    WBenchMsg,a1
  171.     jsr    ReplyMsg(a6)
  172. pas_work:moveq    #0,d0
  173.     rts
  174. WBenchMsg:
  175.     dc.l    0
  176.  
  177.     ; ****************
  178.     ; * PG PRINCIPAL *
  179.     ; ****************
  180. main_pg:
  181.     bsr    sync            ; attente de la synchro
  182.     bsr    switch            ; switching de page
  183.     bsr    bltclear        ; effacement de l'ecran
  184.     bsr    initblit        ; initialise les registre du blitter pour trace de ligne
  185.     bsr    affobj            ; affiche l'objet
  186.     bsr    tstclav            ; test du clavier
  187.     btst    #6,$bfe001        ; appui sur le bouuton de la souris?
  188.     bne    main_pg            ; si non, on continue
  189.     rts
  190.  
  191.     ; ##########################
  192.     ; Affichage d'un objet en 3d
  193.     ; ##########################
  194.     ; Remarque: A4 va par la suite etre utilise comme pointeur
  195.     ; sur l'objet,ne pas le modifier!
  196. affobj:
  197.     move.w    numobj(pc),d7        ; numero d'objet courant
  198.     lsl.w    #2,d7            ; mul*4
  199.     lea    tabobj(pc),a4        ; table des pointeur sur les objets
  200.     move.l    (a4,d7.w),a4        ; a4 pointe sur la structure de l'objet
  201.     bsr    tstangle        ; test de depassement des angles
  202.     bsr    calc_matr        ; calcule de la matrice de rotation
  203.     bsr    calcul_coord        ; calcul des coord 2d de chaque point
  204.     bsr    aff_line        ; affichage des lignes de l'objet
  205.     rts
  206.  
  207.  
  208.     ; ##############################################
  209.     ; # TEST SI L'ANGLE CONTENU DANS D0 EST VALIDE #
  210.     ; ##############################################
  211. tst_borne
  212.     tst.w    d0            ; l'angle est negatif?
  213.     bpl.s    rot1
  214.     add.w    #360,d0            ; si oui,on rajoute 360
  215. rot1:    cmp.w    #360,d0            ; l'angle est sup a 360
  216.     blt.s    rot2
  217.     sub.w    #360,d0            ; si ouion soustrait 360
  218. rot2:
  219.     rts
  220.  
  221.  
  222.     ; ###########################
  223.     ; TEST DE VALIDITE DES ANGLES
  224.     ; ###########################
  225. tstangle:
  226.     lea    vitx_a-objet1(a4),a3    ; pointeur sur la vitesse de rot de l'objet
  227.     bsr.s    un_angle        ; angle x
  228.     bsr.s    un_angle        ; angle y
  229.     bsr.s    un_angle        ; anglez
  230.     
  231.     movem.w    vitx1-objet1(a4),d0-d2    ; lecture des vitesses de translation
  232.     add.w    d0,posx1-objet1(a4)    ; on aditionne ces vitesses au position
  233.     add.w    d1,posy1-objet1(a4)    ; x y et z de l'objet
  234.     add.w    d2,posz1-objet1(a4)
  235.     rts
  236.     ; MISE A JOUR ET TEST D'UN ANGLE
  237. un_angle:
  238.     move.w    (a3),d0        ; recupere la vitesse de rotation
  239.     cmp.w    #360,d0        ; la vitesse de rotation ne doit pas
  240.     blt.s    pas_dep        ; etre superieure a 360 degre par image
  241.     sub.w    #360,d0
  242. pas_dep:
  243.     cmp.w    #-360,d0    ; la vitesse est superieure a - 360 deg?
  244.     bgt.s    pas_dep2
  245.     add.w    #360,d0
  246. pas_dep2:
  247.     move.w    d0,(a3)        ; sauve la nouvelle vitesse
  248.     add.w    anglex1-vitx_a(a3),d0; on ajoute l'angle de l'objet
  249.     bsr    tst_borne     ; verifie si l'angle est compri entre 0 et 360
  250.     move.w    d0,anglex1-vitx_a(a3); sauvegarde du nouvel angle
  251.     addq    #2,a3
  252.     rts
  253.     
  254.  
  255.     ; ####################
  256.     ; #SWITCHING DE PAGE #
  257.     ; ####################
  258. switch:
  259.     move.l    graphbase(pc),a1
  260.     move.l    abitplane0(pc),d0    ; d0 et d1 contiennent les
  261.     move.l    bbitplane0(pc),d1    ; adresses des deux buffers
  262.     tst.b    flagcop            ; autre page?
  263.     beq.s    next_switch
  264.     exg    d1,d0            ; on inverse l'ecran physique et logique
  265. next_switch:
  266.     move.l    d1,bitplane0        ; on sauve l'adresse de l'ecran logique
  267.     move.l    coplist,$32(a1)
  268.     move.l    p_bitcop,a0        ; ainsi qu celle de l'ecran physique
  269.     bsr    initbrush        ; met la nouvelle adresse dans la
  270.                     ; coperlist
  271.     not.b    flagcop            ; on indique que les 2 ecrans on ete inverse
  272.     rts
  273. p_bitcop:dc.l    0
  274. flagcop:dc.b    0
  275.     even
  276.  
  277.     ; ATTENTE DE LA SYNCHRO
  278.  
  279. sync:    cmp.b    #50,VHPOSR+COPRBASE    ; attent la 50eme ligne pour
  280.     bne.s    sync            ; changer d'ecran
  281.     rts
  282.  
  283.     ; PG D'AFFICHAGE DES LIGNES
  284.  
  285. aff_line:
  286.     move.w    nblignes1-objet1(a4),d7    ; nombre de lignes de l'objets
  287.     subq    #1,d7
  288.     move.l    tabpos(pc),a5        ; table des positions 2D
  289.     move.l    descrline1-objet1(a4),a6; table des numeros de points
  290.                     ; a relier
  291. next_aff_line:
  292.     move.w    (a6)+,d6        ; numero du point de depart
  293.     asl.w    #2,d6            ; un point=4 octets
  294.     movem.w    (a5,d6.w),d0/d1        ; coord x et y de depart
  295.     move.w    (a6)+,d6        ; numero point d'arrivee
  296.     asl.w    #2,d6            ; mul*4
  297.     movem.w    (a5,d6.w),d2/d3        ; coord x,y d'arrivee
  298.     bsr    drawline        ; trace d'une ligne
  299.     dbf    d7,next_aff_line    ; tant qu'il y a des lignes
  300.     rts
  301.  
  302.     ; ##########################################
  303.     ; # TRANSFORMATION DES COORD 3D EN COORD 2D#
  304.     ; ##########################################
  305. calcul_coord:
  306.     move.l    tabpos(pc),a0        ; table qui conteindra les coord 2D
  307.     move.l    descrtabx1-objet1(a4),a1; table des coord 3d
  308.     move.w    nbpoints1-objet1(a4),d7    ; nb de points de l'objet
  309.     subq    #1,d7
  310. loop:    movem.w    (a1)+,d0-d2        ; coord x,y,z du point
  311.  
  312.     lsl.l    #3,d0        ; augmente la precision lors de calculs
  313.     lsl.l    #3,d1        ; (il y aura plus de chiffres significatifs)
  314.     lsl.l    #3,d2
  315.     bsr    rot        ; rotation du point->coord xr,yr,zr
  316.     bsr    calc_coord    ; transformation x,y,z en xe,ye
  317.  
  318.     move.w    d0,(a0)+    ; sauvegarde de xe
  319.     move.w    d1,(a0)+    ; sauvegarde de ye
  320.  
  321.     dbf    d7,loop        ; tant qu'il y a des points
  322.     rts
  323.  
  324.     ; CALCUL DES COORD ECRANS
  325.     ; en entree d0,d1,d2 -> x,y,z
  326.     ; en sortie xe,ye d0,d1
  327.     
  328. calc_coord:
  329.  
  330.     add.w    distz(pc),d2    ; distance de l'ecran
  331.     beq    no_div        ; eviter la div par 0
  332.     ext.l    d0        ; transformation en mot long
  333.     lsl.l    #8,d0        ; mult par 256
  334.     divs    d2,d0        ; xe=x*e/(z+d)
  335.     add.w    #160,d0        ; centrage sur un ecran de 320 points
  336.     ext.l    d1
  337.     lsl.l    #8,d1
  338.     divs    d2,d1        ; y*e/(z+d)
  339.     neg.w    d1
  340.     add.w    #TAILLEY/2,d1    ; centrage
  341. no_div:
  342.     rts
  343.  
  344.     ; ######################
  345.     ; ROTATION DANS L'ESPACE
  346.     ; ######################
  347.  
  348.     ; en entree:d0,d1,d2 doivent contenir les angle alpha,teta et phi
  349. calc_matr:
  350.     lea    tabcos(pc),a3    ; table des cosinus
  351.     lea    tabsin(pc),a5    ; table des sinus
  352.     moveq    #0,d0
  353.     movem.w    anglex1-objet1(a4),d0-d2    ; angles x,y,z
  354.     lsl.w    #1,d0        ; c'est une table de mots
  355.     lsl.w    #1,d1
  356.     lsl.w    #1,d2
  357.     
  358.     move.w    (a5,d0.w),cosalpha; sauvegarde des angles
  359.     move.w    (a3,d0.w),sinalpha
  360.     move.w    (a5,d1.w),costeta
  361.     move.w    (a3,d1.w),sinteta
  362.     move.w    (a5,d2.w),cosphi
  363.     move.w    (a3,d2.w),sinphi
  364.  
  365.     lea    matr(pc),a3
  366.     move.w    cosalpha(pc),d3
  367.     muls    costeta(pc),d3
  368.     asr.l    #7,d3
  369.     move.w    d3,(a3)        ; coef 0,0
  370.  
  371.     move.w    sinalpha(pc),d4
  372.     muls    cosphi(pc),d4
  373.     neg.l    d4
  374.     move.w    cosalpha(pc),d6
  375.     muls    sinteta(pc),d6
  376.     muls    sinphi(pc),d6
  377.     asr.l    #7,d6
  378.     add.l    d6,d4
  379.     asr.l    #7,d4
  380.     move.w    d4,2(a3)    ; coef 1,0
  381.  
  382.     move.w    sinalpha(pc),d5
  383.     muls    sinphi(pc),d5
  384.     move.w    cosalpha(pc),d6
  385.     muls    sinteta(pc),d6
  386.     muls    cosphi(pc),d6
  387.     asr.l    #7,d6
  388.     add.l    d6,d5
  389.     asr.l    #7,d5
  390.     move.w    d5,4(a3)    ; coef 2,0
  391.     
  392.     move.w    sinalpha(pc),d3
  393.     muls    costeta(pc),d3
  394.     asr.l    #7,d3
  395.     move.w    d3,1*6(a3)    ; coef 0,1
  396.  
  397.     move.w    cosalpha(pc),d4
  398.     muls    cosphi(pc),d4
  399.     move.w    sinalpha(pc),d5
  400.     muls    sinteta(pc),d5
  401.     muls    sinphi(pc),d5
  402.     asr.l    #7,d5
  403.     add.l    d5,d4
  404.     asr.l    #7,d4
  405.     move.w    d4,1*6+2(a3)    ; coef 1,1
  406.  
  407.     move.w    cosalpha(pc),d5
  408.     muls    sinphi(pc),d5
  409.     neg.l    d5
  410.     move.w    sinalpha(pc),d6
  411.     muls    sinteta(pc),d6
  412.     muls    cosphi(pc),d6
  413.     asr.l    #7,d6
  414.     add.l    d6,d5
  415.     asr.l    #7,d5
  416.     move.w    d5,1*6+4(a3)    ; coef 2,1
  417.     
  418.     move.w    sinteta(pc),d3
  419.     neg.l    d3
  420.     move.w    d3,2*6(a3)    ; coef 0,2
  421.  
  422.     move.w    sinphi(pc),d4
  423.     muls    costeta(pc),d4
  424.     asr.l    #7,d4
  425.     move.w    d4,2*6+2(a3)    ; coef 1,2
  426.  
  427.     move.w    costeta(pc),d5
  428.     muls    cosphi(pc),d5
  429.     asr.l    #7,d5
  430.     move.w    d5,2*6+4(a3)    ; coef 2,2
  431.     rts
  432.  
  433.     
  434.     ;#####################
  435.     ; ROTATION D'UN POINTS
  436.     ;#####################
  437.     ; en entree:d0-d2 =coord 3d avant rotation
  438.     ; en sortie:d0-d2 =coord 3d apres rotation
  439. rot:
  440.     movem.l    a3/d3-d7,-(a7)
  441.     lea    matr(pc),a3    ; pointeur sur la matrice de rotation
  442.     bsr    calc_col    ; calcul de la premiere colonne=x
  443.     add.w    posx1-objet1(a4),d3
  444.     move.w    d3,-(a7)    ; sauve x resultant
  445.     bsr    calc_col    ; deuxieme colonne=y
  446.     add.w    posy1-objet1(a4),d3
  447.     move.w    d3,-(a7)    ; sauve y resultant
  448.     bsr    calc_col    ; troisieme colonne=z
  449.     add.w    posz1-objet1(a4),d3
  450.     move.w    d3,d2        ; z resultant
  451.     move.w    (a7)+,d1    ; recupere y
  452.     move.w    (a7)+,d0    ; recupere x
  453.     movem.l    (a7)+,d3-d7/a3    ; recupere les registres
  454.     rts
  455.     ; porduit matriciel d'une colonne
  456. calc_col:
  457.     move.w    d0,d3
  458.     move.w    d1,d4
  459.     move.w    d2,d5
  460.     muls    (a3)+,d3
  461.     muls    (a3)+,d4
  462.     muls    (a3)+,d5
  463.     add.l    d4,d3
  464.     add.l    d5,d3
  465.     asr.l    #7,d3
  466.     rts
  467.  
  468. cosalpha:dc.w    0
  469. sinalpha:dc.w    0
  470. costeta:dc.w    0
  471. sinteta:dc.w    0
  472. cosphi:    dc.w    0
  473. sinphi:    dc.w    0
  474.     ; matrice de la rotation
  475. matr:    dcb.w    3*3
  476.  
  477. ;======================================
  478. drawline:
  479.     ;    AFFICHAGE LINE
  480.     ;D0,D1 : ABSCISSES (INITALE,FINALE)
  481.     ;D2,D3 : ORDONNEES (INITALE,FINALE)
  482.     ; Voir Hardware Manuel pour + de details
  483.     
  484.     movem.l    a5/a0-a2/d4-d7,-(a7)
  485.  
  486.     lea    COPRBASE,a5
  487.     
  488.     sub.w    d0,d2    ; calcul de deltax 
  489.     sub.w    d1,d3    ; calcul de deltay
  490.  
  491.     move.b    d0,d4
  492.     lsl.w    #8,d4
  493.     lsl.w    #4,d4
  494.     or.w    #%101100000000+$ca,d4
  495.     move.l    bitplane0(pc),a0
  496.     lsr.w    #3,d0
  497.     and.b    #$fe,d0
  498.     mulu    #40,d1
  499.     add.l    d1,a0
  500.     lea    (a0,d0.w),a0    ; a0 = pointeur sur le depart
  501.  
  502.     moveq    #0,d0    ; 
  503.     tst.w    d2    ; deltax<0
  504.     bpl.s    df_xp
  505.     eor.b    #%011,d0; change de cadrant
  506.     neg.w    d2
  507. df_xp:
  508.     neg.w    d3    ; deltay=-deltay
  509.     bpl.s    df_yp    ; deltay<0
  510.     eor.b    #%111,d0    
  511.     neg.w    d3
  512. df_yp:
  513.  
  514.     cmp.w    d2,d3
  515.     bmi.s    df_xg
  516.     move.w    d3,d1
  517.     eor.b    #%001,d0
  518.     exg    d2,d3
  519.     bra.s    df_calc
  520. df_xg:    move.w    d2,d1
  521. df_calc:
  522.     bsr    waitblit
  523.     move.l    a0,BLTCPTH(a5)
  524.     move.l    a0,BLTDPTH(a5)
  525.     moveq    #0,d6
  526.     move.b    ft_octs(pc,d0.w),d6
  527.  
  528.     addq.w    #1,d1
  529.     lsl.w    #6,d1
  530.     addq    #2,d1
  531.     move.w    d4,BLTCON0(a5)
  532.  
  533.     move.w    d3,d0
  534.  
  535.     lsl.w    #1,d0
  536.     sub.w    d2,d0
  537.     bge.s    df_nosign
  538.     or.w    #$40,d6
  539. df_nosign:
  540.     move.w    d6,BLTCON1(a5)
  541.     move.w    d0,BLTAPTH+2(a5)
  542.     lsl.w    #2,d3
  543.     move.w    d3,BLTBMOD(a5)
  544.     sub.w    d2,d0
  545.     lsl.w    #1,d0
  546.     move.w    d0,BLTAMOD(a5)
  547.     move.w    d1,BLTSIZE(a5)        ; START DRAWING
  548.     movem.l    (a7)+,a5/a0-a2/d4-d7
  549.     rts
  550.     
  551. ft_octs:
  552.     dc.b    %0011001,%0000101,%0001101,%0011101
  553.     dc.b    %0010101,%0001001,%0000001,%0010001
  554.  
  555.     ; attent que le blitter ait fini
  556. waitblit:
  557.     btst    #14,DMACONR+COPRBASE
  558.     bne    waitblit
  559.     rts
  560.     
  561.     ; INITIALISE CERTAINS REGISTRES DU BLITTE POUR LE TRACER DE
  562.     ; LIGNES
  563.  
  564. initblit:                ; initialisation lignes blitter
  565.     bsr    waitblit
  566.     lea    COPRBASE,a5
  567.     move.w    #40*prof,d1
  568.     move.w    d1,BLTCMOD(a5)    ;bltcmod:largeur ecran
  569.     move.w    d1,BLTDMOD(a5)    ;bltdmod:   "      "
  570.     moveq    #-1,d0
  571.     move.l    d0,BLTAFWM(a5)
  572.     move.l    d0,BLTBDAT(a5)
  573.     move.w    #-$8000,BLTADAT(a5)
  574.     rts
  575.  
  576.  
  577.     ; EFFACEMENT AU BLITTER D'UN BITMAP
  578.  
  579. bltclear:
  580.     bsr    waitblit
  581.     lea    COPRBASE,a5
  582.     move.l    bitplane0(pc),a0    ; adresse de la zone a effacer
  583.     move.l    a0,BLTDPTH(a5)
  584.     move.w    #$01f0,BLTCON0(a5)    ; destination activee
  585.     move.w    #$0000,BLTCON1(a5)    ; 
  586.     move.w    #0,BLTADAT(a5)        ; remplissage de 0
  587.     clr.w    BLTDMOD(a5)        ; modulo=0
  588.     move.w    #TAILLEY,d0        ; nb de lignes a remplir
  589.     lsl.w    #6,d0
  590.     or.w    #20,d0            ; nombre de mots de chaque ligne
  591.     move.w    d0,BLTSIZE(a5)        ; depart de l'effacement
  592.     rts
  593.     ; OUVERTURE DES LIBRAIRIES
  594.  
  595. initlib:
  596.     move.l    #grafname,a1    ; nom de la librairie
  597.     move.l    execbase,a6    ; pointeur sur la librairie EXEC
  598.     jsr    openlib(a6)    ; ouverture de la graphics.library
  599.     move.l    d0,graphbase    ; sauvegarde de la base de la libr.
  600.     rts
  601.  
  602.     ; REFERME LES LIBRAIRIES
  603.  
  604. freelib:
  605.     move.l    graphbase(pc),a1; base de la librairie a fermer
  606.     move.l    execbase,a6    ; librairie exec
  607.     jsr    closelib(a6)    ; fermeture de la librairie
  608.     rts
  609.  
  610. grafname:dc.b    'graphics.library',0
  611.     even
  612. graphbase:dcb.l    1
  613.  
  614.  
  615.     ; TESTE LES TOUCHES DU CLAVIER
  616. tstclav:
  617.     sub.b    #1,tempo_clav    ; temporisation clavier,pour que
  618.     beq    new_car        ; mobile n'aille pas trop vite de suite
  619.     rts
  620. new_car:
  621.     move.b    #5,tempo_clav
  622.     move.b    $bfec01,d0    ; code de la touche courante
  623.     eor.b    #$ff,d0
  624.     ror.b    #1,d0
  625.  
  626.     cmp.b    #$50,d0
  627.     bne    pas_f1
  628.     move.w    #0,numobj
  629. pas_f1:
  630.     cmp.b    #$51,d0
  631.     bne    pas_f2
  632.     move.w    #1,numobj
  633. pas_f2:
  634.     cmp.b    #$1e,d0    ; gestion eloignement
  635.     bne    pasz
  636.     subq.w    #8,distz
  637. pasz:    cmp.b    #$3e,d0
  638.     bne    paszp
  639.     addq.w    #8,distz
  640. paszp:
  641.     cmp.b    #$57,d0
  642.     
  643.     cmp.b    #$4e,d0    ; gestion anglex
  644.     bne    pash
  645.     addq.w    #1,vitx_a-objet1(a4)
  646. pash:    cmp.b    #$4f,d0
  647.     bne    pasb
  648.     subq.w    #1,vitx_a-objet1(a4)
  649. pasb:    
  650.     cmp.b    #$4d,d0    ; gestion angley
  651.     bne    pasg
  652.     addq.w    #1,vity_a-objet1(a4)
  653. pasg:    cmp.b    #$4c,d0
  654.     bne    pasd
  655.     subq.w    #1,vity_a-objet1(a4)
  656. pasd:
  657.     cmp.b    #$0f,d0    ; gestion anglez
  658.     bne    pasrg
  659.     subq.w    #1,vitz_a-objet1(a4)
  660. pasrg:    cmp.b    #$3c,d0
  661.     bne    pasrd
  662.     addq.w    #1,vitz_a-objet1(a4)
  663. pasrd:
  664.     cmp.b    #$45,d0
  665.     bne    pas_esc
  666.     bsr    panic
  667.     clr.w    vitx_a-objet1(a4)
  668.     clr.w    vity_a-objet1(a4)
  669.     clr.w    vitz_a-objet1(a4)
  670. pas_esc:
  671.  
  672.     move.b    last_touche,d1
  673.     move.b    d0,last_touche
  674.     cmp.b    d0,d1
  675.     beq    sortclav
  676.     cmp.b    #0,d0
  677.  
  678. sortclav:
  679.     rts
  680. last_touche:dc.b 0
  681.     even
  682. panic:
  683.     clr.w    vitx1-objet1(a4)
  684.     clr.w    vity1-objet1(a4)
  685.     clr.w    vitz1-objet1(a4)
  686.     clr.w    posx1-objet1(a4)
  687.     clr.w    posy1-objet1(a4)
  688.     clr.w    posz1-objet1(a4)
  689.     rts
  690.  
  691. tempo_clav:dc.b    10
  692.     even
  693.     ; INITIALISATION DE LA COPPER LIST
  694.  
  695. initcop:
  696.     move.l     coplist(pc),a0    ; adresse de la copper list
  697.  
  698.     lea    mycop(pc),a1    ; on recopie le debut en chip
  699. tfrcop:    move.l    (a1)+,(a0)+
  700.     cmp.l    #fincop,a1
  701.     bne    tfrcop
  702.  
  703.     move.l    a0,p_bitcop    ; sauvegarde l'endroit de la coplist
  704.     move.l    abitplane0,d0    ; ou on initialise les bitlanes
  705.     bsr    initbrush    ; on initialise les adrs des bitplanes
  706.  
  707.     lea    mycop2(pc),a1    ; recopie de la fin de la coperlist
  708. tfrcop2:move.l    (a1)+,(a0)+
  709.     cmp.l    #fincop2,a1
  710.     bne    tfrcop2
  711.  
  712.     move.l    graphbase,a0
  713.     move.l    $32(a0),oldcop    ; sauvegarde le pointeur de l'ancienne coplist
  714.     move.l    coplist,$32(a0); met le nouveau pointeur
  715. ;    lea    COPRBASE,a5
  716. ;    move.l    coplist,COP1LCH(a5)
  717. ;    clr.w    COPJMP1(a5)
  718.     rts
  719.  
  720.     ; MET DANS LA COPPER LIST LES ADRESSES DES BITPLANES
  721.  
  722. initbrush:            ; d0 contient l'adresse du prem plan
  723.     move.w    #$00e0,d1    ; adresses de bitp0h
  724.     bsr    metadr
  725.     bsr    metadr
  726.     rts
  727.  
  728. metadr:                ; cet ici qu'on le met dans la coplist
  729.     swap    d0
  730.     move.w    d1,(a0)+
  731.     move.w    d0,(a0)+
  732.     addq.w    #2,d1
  733.     rts
  734.  
  735.  
  736. mycop:
  737.     dc.w    $1001,$fffe
  738.     dc.w    $180,0
  739.     dc.w    $182,$fff
  740.     dc.w    $130,0,$132,0,$134,0,$136,0
  741.     dc.w    $138,0,$13a,0,$13c,0,$13e,0
  742.     dc.w    $008e,$2581
  743.     dc.w    $0090,$40c1
  744.     dc.w    $0092,$0038
  745.     dc.w    $0094,$00cc
  746.     dc.w    $0100,$1000
  747.     dc.w    $102,0
  748.     dc.w    $108,(prof-1)*40
  749.     dc.w    $10a,(prof-1)*40
  750. fincop:
  751. mycop2:
  752.     dc.l    $ffddfffe
  753.     dc.l    $2401fffe
  754.     dc.l    $01000000
  755.     dc.l    $fffffffe
  756. fincop2:
  757. coplist:    dc.l    0
  758. oldcop:    dc.l    0
  759.  
  760. ;DONNES
  761.  
  762. bitplane0:dcb.l        1
  763. abitplane0:dcb.l    1
  764. bbitplane0:dcb.l    1
  765.  
  766. tabcos:    incbin    demos:datasin    ; table des sinus et cosinus
  767. tabsin=tabcos+720
  768.  
  769. tabpos:    dc.l    0        ; pointeur sur la table des position 2D
  770. numobj:    dc.w    0        ; numero de l'obj en cours
  771. tabobj:    dc.l    objet1,objet2
  772.  
  773.  
  774. null:    dc.w    0
  775.     ; STRUCTURE DEFINISSANT LE PREMIER OBJET
  776. objet1:
  777. nbpoints1:dc.w    20    ; nombre de points
  778. nblignes1:dc.w    32    ; nombre de lignes
  779. descrline1:dc.l    tabline1; pointeur sur la table des numero de points
  780. descrtabx1:dc.l    itabx1    ; pointeur sur la table des coord 3d de chaque pt
  781. posx1:  dc.w    0    ; position x,y,z de l'objet
  782. posy1:  dc.w    0    
  783. posz1:  dc.w    0
  784. anglex1:dc.w    0    ; valeur des angles de l'objet
  785. angley1:dc.w    90
  786. anglez1:dc.w    40
  787. vitx1:  dc.w    0    ; vitesses de translation
  788. vity1:    dc.w    0
  789. vitz1:    dc.w    0
  790. vitx_a:    dc.w    0    ; vitesses de rotation
  791. vity_a:    dc.w    0
  792. vitz_a:    dc.w    0
  793.     ; table des numero de points formant une ligne
  794. tabline1:    
  795.     dc.w    0,1,1,2,2,3,3,0,0,4,1,4,2,4,3,4
  796.     dc.w    5,6,6,7,7,8,8,5,5,9,6,9,7,9,8,9
  797.     dc.w    10,11,11,12,12,13,13,10,10,14,11,14,12,14,13,14
  798.     dc.w    15,16,16,17,17,18,18,15,15,19,16,19,17,19,18,19
  799.     ; table des coord 3d de chaque point
  800. itabx1:    
  801.     dc.w    -10,-10,5,-10,10,5,10,10,5,10,-10,5
  802.     dc.w    0,0,15
  803.     dc.w    -10,-10,-5,-10,10,-5,10,10,-5,10,-10,-5
  804.     dc.w    0,0,-15
  805.     dc.w    -10,-10,-25,-10,10,-25,10,10,-25,10,-10,-25
  806.     dc.w    0,0,-20
  807.     dc.w    -10,-10,25,-10,10,25,10,10,25,10,-10,25
  808.     dc.w    0,0,20
  809.  
  810. objet2:
  811. nbpoints2:dc.w    8    ; nombre de points
  812. nblignes2:dc.w    12    ; nombre de lignes
  813. descrline2:dc.l    tabline2; pointeur sur la table des numero de points
  814. descrtabx2:dc.l    itabx2    ; pointeur sur la table des coord 3d de chaque p
  815. posx2:    dc.w    0,0,0
  816. anglex2:dc.w    0,0,0
  817. vitx2:  dc.w    0,0,0
  818. vitx_a2:    dc.w    0,0,0
  819.     ; table des numero de points formant une ligne
  820. tabline2:    
  821.     dc.w    0,1,1,2,2,3,3,0
  822.     dc.w    4,5,5,6,6,7,7,4
  823.     dc.w    0,4,1,5,2,6,3,7    
  824.     ; table des coord 3d de chaque point
  825. itabx2:    
  826.     dc.w    -10,-10,-10,-10,10,-10,10,10,-10,10,-10,-10
  827.     dc.w    -10,-10,10,-10,10,10,10,10,10,10,-10,10
  828.  
  829. tailleplan=TAILLEY*40
  830. taillescr=tailleplan*prof
  831. taillecop=100
  832.  
  833. distz:dc.w    600
  834.  
  835.